//init variables
var isRichText = false;var rng;var currentRTE;var allRTEs = "";
var imagesPath;
var includesPath;var cssFile;var rteInitilized=false;

function initRTE(imgPath, incPath, css) {
  if(!rteInitilized){
    //set browser vars
    //check to see if designMode mode is available
    if (document.getElementById && (document.designMode)) {isRichText = true;}

    if (!isIE) document.captureEvents(Event.MOUSEOVER | Event.MOUSEOUT | Event.MOUSEDOWN | Event.MOUSEUP);
    //document.onmouseover = raiseButton;
    //document.onmouseout  = normalButton;
    //document.onmousedown = lowerButton;
    //document.onmouseup   = raiseButton;
    //set paths vars
    imagesPath = imgPath;
    includesPath = incPath;
    cssFile = css;
    if (isRichText){
      document.writeln('<style type="text/css">@import "' + includesPath + 'rte.css";</style>');
      //document.writeln('< script src="/grape/scripts/editarea.js">< /  script>');
    }
        
    //for testing standard textarea, uncomment the following line
    //isRichText = false;
    rteInitilized=true;
  }
}

function writeRichText(rte, html, width, height, buttons, readOnly) {
  if (isRichText) {if (allRTEs.length > 0) allRTEs += ";";allRTEs += rte;writeRTE(rte, html, width, height, buttons, readOnly);
  }else{writeDefault(rte, html, width, height, buttons, readOnly);}
}

function writeDefault(rte, html, width, height, buttons, readOnly) {
  if(!readOnly){document.writeln('<textarea onpaste="alert(\'The text is being pasted\')" name="' + rte + '" id="' + rte + '" style="width: ' + width + 'px; height: ' + height + 'px;">' + html + '</textarea>');
  }else{document.writeln('<textarea onpaste="alert(\'The text is being pasted\')" name="' + rte + '" id="' + rte + '" style="width: ' + width + 'px; height: ' + height + 'px;" readonly>' + html + '</textarea>');}
}

function raiseButton(e) {
  if(isIE){var el = window.event.srcElement;}else{var el= e.target;}
  className = el.className;
  if (className == 'rteImage' || className == 'rteImageLowered') {el.className = 'rteImageRaised';}
}

function normalButton(e) {
  if (isIE) {var el = window.event.srcElement;} else {var el= e.target;}
  className = el.className;
  if (className == 'rteImageRaised' || className == 'rteImageLowered') {el.className = 'rteImage';}
}

function lowerButton(e) {
  if (isIE) {
          var el = window.event.srcElement;
  } else {
          var el= e.target;
  }
  
  className = el.className;
  if (className == 'rteImage' || className == 'rteImageRaised') {
          el.className = 'rteImageLowered';
  }
}

function writeRTE(rte, html, width, height, buttons, readOnly) {
  if (readOnly) buttons = false;
  
  //adjust minimum table widths
  if (isIE) {
          if (buttons && (width < 600)) width = 600;
          var tablewidth = width;
  } else {
          if (buttons && (width < 500)) width = 500;
          var tablewidth = width + 4;
  }  
  document.getElementById('hdn' + rte).value = html;
  enableDesignMode(rte, html, readOnly);
}

function enableDesignMode(rte, html, readOnly) {
  if(html=="stored_html")html=stored_html[rte];
  var frameHtml = "<html id=\"" + rte + "\">\n";
  frameHtml += "<head>\n";
  //to reference your stylesheet, set href property below to your stylesheet path and uncomment
  if(cssFile.length > 0) {
    frameHtml += "<link media=\"all\" type=\"text/css\" href=\"" + cssFile + "\" rel=\"stylesheet\">\n";
  }

  if(isGecko){
    html=html!=""?html:"<br>";
  }
  frameHtml += "<style>\n";
  frameHtml += "body{\n";
  frameHtml += "  background: #FFFFFF;\n";
  frameHtml += "  margin: 0px;\n";
  frameHtml += "  padding: 0px;\n";
  frameHtml += "}\n";
  frameHtml += "p{\n";
  frameHtml += "  margin: 0px;\n";
  frameHtml += "  padding: 0px;\n";
  frameHtml += "  margin-bottom: 5px;\n";
  frameHtml += "}\n";
  frameHtml += "</style>\n";
  frameHtml += "</head>\n";
  frameHtml += "<body>\n";
  frameHtml += html + "\n";
  frameHtml += "</body>\n";
  frameHtml += "</html>";
  
  if(document.all){
    var oRTE = frames[rte].document;
    oRTE.open();
    oRTE.write(frameHtml);
    oRTE.close();
    if (!readOnly) oRTE.designMode = "On";
  }else{
    try {
      if (!readOnly) document.getElementById(rte).contentDocument.designMode = "on";
      try {
        var oRTE = document.getElementById(rte).contentWindow.document;
        oRTE.open();
        oRTE.write(frameHtml);
        oRTE.close();
        if(isGecko && !readOnly){
          //attach a keyboard handler for gecko browsers to make keyboard shortcuts work
          oRTE.addEventListener("keypress", kb_handler, true);
          oRTE.addEventListener("paste", kb_paste, true);
        }
      }catch(e){
         logging("Error enableDesignMode: Error preloading content:"+e.message);    
      }
    }catch(e){
      //gecko may take some time to enable design mode.
      //Keep looping until able to set.
      stored_html[rte]=html;
      setTimeout("enableDesignMode('" + rte + "', 'stored_html', " + readOnly + ");", 100);
    }
  }
}

function kb_paste(evt){
  try{
  	var o=evt.target;
	  while((o.id+""==""||o.id+""=="undefined")&&o){o=o.parentNode;}
	  if(!o)alert("not found");
	  var rte = o.id;	  
	  var oRTE= document.getElementById(rte);
	  setTimeout("cleanup('" + rte + "');", 1000);
  }catch(e){
    alert("Error in kb_paste:"+e.message);
  }
}


function updateRTEs() {
  var vRTEs = allRTEs.split(";");
  for (var i = 0; i < vRTEs.length; i++) {
          updateRTE(vRTEs[i]);
  }
}

function updateRTE(rte) {
  if (!isRichText) return;
  
  //set message value
  var oHdnMessage = document.getElementById('hdn' + rte);
  var oRTE = document.getElementById(rte);
  var readOnly = false;
  
  //check for readOnly mode
  if(document.all){
    if (frames[rte].document.designMode != "On") readOnly = true;
  }else{
    if(document.getElementById(rte).contentDocument.designMode != "on"){readOnly = true;}
  }
  
  if (isRichText && !readOnly) {
    //if viewing source, switch back to design view
    if (document.getElementById("chkSrc" + rte).checked) {
      document.getElementById("chkSrc" + rte).checked = false;
      toggleHTMLSrc(rte);
    }
    
    if (oHdnMessage.value == null) oHdnMessage.value = "";
    if (document.all) {
      oHdnMessage.value = frames[rte].document.body.innerHTML;
    } else {
      oHdnMessage.value = oRTE.contentWindow.document.body.innerHTML;
    }
    
    //if there is no content (other than formatting) set value to nothing
    if (stripHTML(oHdnMessage.value.replace("&nbsp;", " ")) == "" 
      && oHdnMessage.value.toLowerCase().search("<hr") == -1
      && oHdnMessage.value.toLowerCase().search("<img") == -1) oHdnMessage.value = "";
    //fix for gecko
    if (escape(oHdnMessage.value) == "%3Cbr%3E%0D%0A%0D%0A%0D%0A") oHdnMessage.value = "";
  }
}

function toggleHTMLSrc(rte,inv) {
  //contributed by Bob Hutzel (thanks Bob!)
  var oRTE;
  var nchk = 'chkSrc' + rte;

	if(inv){getElement(nchk).checked=!getElement(nchk).checked;}

  if (document.all) {
    oRTE = frames[rte].document;
  } else {
    oRTE = document.getElementById(rte).contentWindow.document;
  }

  
  if (getElement(nchk).checked) {
    document.getElementById("buttons_" + rte).style.display = "none";
    if (document.all) {
            oRTE.body.innerText = oRTE.body.innerHTML;
    } else {
            var htmlSrc = oRTE.createTextNode(oRTE.body.innerHTML);
            oRTE.body.innerHTML = "";
            oRTE.body.appendChild(htmlSrc);
    }
  } else {
    document.getElementById("buttons_" + rte).style.display = "block";
    if (document.all) {
            //fix for IE
            var output = escape(oRTE.body.innerText);
            output = output.replace("%3CP%3E%0D%0A%3CHR%3E", "%3CHR%3E");
            output = output.replace("%3CHR%3E%0D%0A%3C/P%3E", "%3CHR%3E");
            oRTE.body.innerHTML = unescape(output);
    } else {
            var htmlSrc = oRTE.body.ownerDocument.createRange();
            htmlSrc.selectNodeContents(oRTE.body);
            oRTE.body.innerHTML = htmlSrc.toString();
    }
  }
}

//Function to format text in the text box
function FormatText(rte, command, option) {
  var oRTE;
  if (document.all) {
    oRTE = frames[rte];    
    //get current selected range
    var selection = oRTE.document.selection; 
    if (selection != null) {
            rng = selection.createRange();
    }
  } else {
    oRTE = document.getElementById(rte).contentWindow;
    
    //get currently selected range
    var selection = oRTE.getSelection();
    rng = selection.getRangeAt(selection.rangeCount - 1).cloneRange();
  }
  
  try {
    if (command == "cleanup"){
      cleanup(rte);
      return true;
    }
    if ((command == "forecolor") || (command == "hilitecolor")) {
      //save current values
      parent.command = command;
      currentRTE = rte;
      
      //position and show color palette
      buttonElement = document.getElementById(command + '_' + rte);
      // Ernst de Moor: Fix the amount of digging parents up, in case the RTE editor itself is displayed in a div.
      document.getElementById('cp' + rte).style.left = getOffsetLeft(buttonElement, 4) + "px";
      document.getElementById('cp' + rte).style.top = (getOffsetTop(buttonElement, 4) + buttonElement.offsetHeight + 4) + "px";
      if (document.getElementById('cp' + rte).style.visibility == "hidden") {
              document.getElementById('cp' + rte).style.visibility = "visible";
              document.getElementById('cp' + rte).style.display = "inline";
      } else {
              document.getElementById('cp' + rte).style.visibility = "hidden";
              document.getElementById('cp' + rte).style.display = "none";
      }
    } else if (command == "createlink") {
      var szURL = prompt("Enter a URL:", "");
      try{
        //ignore error for blank urls
        oRTE.document.execCommand("Unlink", false, null);
        oRTE.document.execCommand("CreateLink", false, szURL);
      }catch (e){
        //do nothing
      }
    }else if(command == "image_insert") {
        AddImage(rte);
    }else{
      oRTE.focus();
      oRTE.document.execCommand(command, false, option);
      oRTE.focus();
    }
  } catch (e) {
     alert("Error enableDesignMode:"+e.message);    
  }
}

// Ernst de Moor: Fix the amount of digging parents up, in case the RTE editor itself is displayed in a div.
function getOffsetTop(elm, parents_up) {
  var mOffsetTop = elm.offsetTop;
  var mOffsetParent = elm.offsetParent;
  
  if(!parents_up) {
    parents_up = 10000; // arbitrary big number
  }
  while(parents_up>0 && mOffsetParent) {
    mOffsetTop += mOffsetParent.offsetTop;
    mOffsetParent = mOffsetParent.offsetParent;
    parents_up--;
  }  
  return mOffsetTop;
}

// Ernst de Moor: Fix the amount of digging parents up, in case the RTE editor itself is displayed in a div.
function getOffsetLeft(elm, parents_up) {
  var mOffsetLeft = elm.offsetLeft;
  var mOffsetParent = elm.offsetParent;
  
  if(!parents_up) {
    parents_up = 10000; // arbitrary big number
  }
  while(parents_up>0 && mOffsetParent) {
    mOffsetLeft += mOffsetParent.offsetLeft;
    mOffsetParent = mOffsetParent.offsetParent;
    parents_up--;
  }
  
  return mOffsetLeft;
}

function formatSelect(rte, selectname) {
  var oRTE;
  if(document.all){
    oRTE = frames[rte];
    
    //get current selected range
    var selection = oRTE.document.selection; 
    if (selection != null) {
            rng = selection.createRange();
    }
  }else{
    oRTE = document.getElementById(rte).contentWindow;
    //get currently selected range
    var selection = oRTE.getSelection();
    rng = selection.getRangeAt(selection.rangeCount - 1).cloneRange();
  }
  
  var idx = document.getElementById(selectname).selectedIndex;
  // First one is always a label
  if(idx != 0){
    var selected = document.getElementById(selectname).options[idx].value;
    var cmd = selectname.replace('_' + rte, '');
    oRTE.focus();
    oRTE.document.execCommand(cmd, false, '<'+selected+'>');
    oRTE.focus();
    document.getElementById(selectname).selectedIndex = 0;
  }
}

function kb_handler(evt) {
  var rte = evt.target.id;
  
  //contributed by Anti Veeranna (thanks Anti!)
  if(evt.ctrlKey) {
    var key = String.fromCharCode(evt.charCode).toLowerCase();
    var cmd = '';
    switch (key) {
      case 'b': cmd = "bold"; break;
      case 'i': cmd = "italic"; break;
      case 'u': cmd = "underline"; break;
      case 's': cmd = "strike"; break;
    };

    if(cmd) {
      FormatText(rte, cmd, true);
      //evt.target.ownerDocument.execCommand(cmd, false, true);
      // stop the event bubble
      evt.preventDefault();
      evt.stopPropagation();
    }
  }
}

function docChanged (evt) {}

function stripHTML(oldString) {
  var newString = oldString.replace(/(<([^>]+)>)/ig,"");
  //replace carriage returns and line feeds
  newString = newString.replace(/\r\n/g," ");
  newString = newString.replace(/\n/g," ");
  newString = newString.replace(/\r/g," ");
  //trim string
  newString = trim(newString);
  return newString;
}

function trim(inputString) {
  // Removes leading and trailing spaces from the passed string. Also removes
  // consecutive spaces and replaces it with one space. If something besides
  // a string is passed in (null, custom object, etc.) then return the input.
  if (typeof inputString != "string") return inputString;
  var retValue = inputString;
  var ch = retValue.substring(0, 1);
       
  while (ch == " ") { // Check for spaces at the beginning of the string
     retValue = retValue.substring(1, retValue.length);
     ch = retValue.substring(0, 1);
  }
  ch = retValue.substring(retValue.length-1, retValue.length);
       
  while (ch == " ") { // Check for spaces at the end of the string
     retValue = retValue.substring(0, retValue.length-1);
     ch = retValue.substring(retValue.length-1, retValue.length);
  }
  // Note that there are two spaces in the string - look for multiple spaces within the string
  while (retValue.indexOf("  ") != -1) {
               // Again, there are two spaces in each of the strings
     retValue = retValue.substring(0, retValue.indexOf("  ")) + retValue.substring(retValue.indexOf("  ")+1, retValue.length);
  }
  return retValue; // Return the trimmed string back to the user
}


function cleanup(rte){
  try{
    var RTEContent = document.all?document.frames[rte].document.body:getElement(rte).contentDocument.body;
    cleanup_tree(RTEContent);
  }catch(e){
    alert("Error in cleanup : "+e.message);
  }
}

good_tag = new Array("font","a","table","thead","tbody","tr","td","th","ul","ol","li","p","br","em","h1","h2","h3","h4","h5","h6","div","span","u","strong","b","s","i","img","#text");
good_atr = new Array("id","href","valign","align","class","src","alt","title","rowspan","colspan","width","className");
bad_class= new Array("MsoNormal");

function cleanup_tree(o){
  try{
    var i=0;
    while(i<o.childNodes.length){
      var child=o.childNodes[i];
      //alert(child.nodeName);
      if(good_tag.indexOf(new String(child.nodeName).toLowerCase())==-1){
        if(!document.all){
          o.removeChild(child);
        }else{
          //alert(child.nodeName+":"+child.className+":"+child.tagName);
          child.outerHTML=child.innerHTML;
        }
      }else{
        var a=0;
        if(child.attributes){
          while(a<child.attributes.length){
            var attribute = child.attributes[a];
            var name      = new String(attribute.name).toLowerCase();
            var value     = new String(attribute.value).toLowerCase();
            //alert(name+":"+a+":"+child.attributes.length);
            if(good_atr.indexOf(name)==-1){
            	if(!child.removeAttribute(name)){a++;}
            }else{
	            if(name=="class"&&bad_class.indexOf(value)==-1){
	              //alert("ClassName - "+value);
	            	if(!child.removeAttribute("class")&&!child.removeAttribute("className")){a++;}
	            }else{
		            a++;
	  	        }
	    	    }
          }
        }
        if(child.childNodes.length!=0){cleanup_tree(child);}
        i++;
      }
    }
  }catch(e){
    alert("Error in cleanup_tree : "+e.message);
  }
}
